#include<vector>
#include<unordered_map>
#include<algorithm>
#include<iostream>
using namespace std;


class Solution {
public:
    int findLength(vector<int>& A, vector<int>& B) {
        int** dp = new int*[2];
        int size = B.size() + 1;
        dp[0] = new int[size];
        dp[1] = new int[size];
        memset(dp[0], 0, size * sizeof(int));
        memset(dp[1], 0, size * sizeof(int));

        int res = 0;
        for (int i = A.size()-1; i >=0; --i) {
            for (int j = B.size()-1; j >=0; --j) {
                if (A[i] == B[j]) {
                    dp[0][j] = dp[1][j + 1] + 1;
                    res = max(res, dp[0][j]);
                }
                else
                    dp[0][j] = 0;
            }
            swap(dp[0], dp[1]);
            memset(dp[0], 0, size * sizeof(int));
        }
        return res;
    }
};

//int main() {
//    vector<int> A = { 1,2,3,2,1 };
//    vector<int> B = { 3,2,1,4,7 };
//    Solution sol;
//    sol.findLength(A, B);
//}






//
//class Solution {
//public:
//    int findLength(vector<int>& A, vector<int>& B) {
//        unordered_multimap<int, int>map;
//        for (int i = 0; i < B.size(); ++i) 
//            map.emplace(B[i], i);
//
//        int res = 0;
//        for (int i = 0; i < A.size(); ++i) {
//            auto range = map.equal_range(A[i]);
//            int old_i = i;
//            for (auto it = range.first; it != range.second; ++it) {
//                int tmp = 0;
//                for (int j = it->second; j < B.size()&&i<A.size(); ++j,++i) {
//                    if (A[i] == B[j]) {
//                        ++tmp;
//                    }
//                    else
//                        break;
//                }
//                i = old_i;
//                res = max(res, tmp);
//            }
//        }
//        return res;
//    }
//};